i=0;i=i++为什么等于0这个问题困扰了我好长的一段时间,结果前段时间还试图从虚拟机那个层面进行解释,但无论是线程还是方法调用都不能解释其现象,发现方向性错误,这只是一个语言的特性而已。在java lang spec中提到: 1、java运算符的优先级++符是大于=的。 2、The result of the postfix increment expression is not a variable, but a value.后++符表达式的结果是个值而不是一个变量。 也就是说后++符先将自己的值存储起来,然后对变量进行++; 再进行赋值操作,也就是将先存储起来的值赋给变量i,这样的操作就导致了i值被置为0了
由于java和c不同的语言特性,导致了i=i++的不同之处,前面的笔记中已经提到,由于java lang spec中的一些细微规定,导致其运行结果的不同,我们可以用个例子来看i=i++在jvm中实际的运行过程。
源程序test.java:
public class test ... public test() ... publicstaticvoid main(String[] args) ... int i=0; i=i++;
我们用javap来看其实际的虚拟机指令集:
C:
JBuilderX
jdk1 . 4
bin > javap -c -classpath " d:/ " test Compiled from " test.java "
对比而言,对于i++而言,i=i++指令多了两步,2和6 其实这两步是赋值符号引起的,有意思的是第二步出现的时机,是在iinc之前,这就是因为java lang spec中规定的。